package me.zhengjie.modules.quartz.repository;

import me.zhengjie.modules.quartz.domain.SnmpTrap;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

/**
 * Repository实现类的使用：
 *  CrudRepository：增删改查，支持批量操作
 *  PagingAndSortingRepository：增加分页和排序 xxRepository.findAll(PageRequest.of(current, size, Sort.by(Sort.Direction.DESC, "id")));
 *  JpaRepository: 在上面的接口的基础上，又增加了很多方法
 *    示例一:    User user=new User();
 *              user.setAge(2);
 *              Example<User> example = Example.of(user);
 *              List<User> users = userJpaRepository.findAll(example);
 *    示例二: 查询条件为（username like ‘%user%’ and age=2）的数据集合
 *      User user=new User();
 *      user.setAge(2);
 *      user.setUsername("user");
 *      user.setId(1);
 *      ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
 *              .withMatcher("username",ExampleMatcher.GenericPropertyMatchers.contains())// id like %?%
 *              .withMatcher("age", ExampleMatcher.GenericPropertyMatchers.exact())//匹配
 *              .withIgnorePaths("id");//忽略此字段
 *      Example<User> example=Example.of(user,matcher);
 *      List<User> all = userJpaRepository.findAll(example);
 *    关联查询：
 *      @OneToOne    //一对一
 *      @OneToMany  //一对多
 *      @ManyToOne  //多对一
 *      @ManyToMany //多对多
 *
 *  JpaSpecificationExecutor：接口和Repository接口不是一个家族的，它是用对象来写jpql语句的一个接口，内部的操作其实就是Hibernate的CriteriaQuery这种查询方法，这种查询方法，从hibernate开始基本上都很少使用，了解即可
 *      示例：
 *            List<User> all = userJpaRepository.findAll((root, query, criteriaBuilder) -> {
 *                      //查询id>10的User记录
 *                      Path<Integer> path=root.get("id");
 *                      Predicate predicate = criteriaBuilder.greaterThan(path, 10);
 *                      return predicate;
 *                  });
 *              }
 *
 *
 */
public interface DeviceNetworkMsgRepository extends JpaRepository<SnmpTrap, Long>, JpaSpecificationExecutor<SnmpTrap> {

    /**
     * @Query 注解，在该注解中可以使⽤JPQL或SQL来指定此⽅法被调⽤的时候需要执⾏的sql语⾔是什么
     *  使⽤JPQL, @Query操作的对象为实体类
     * @NamedQueries 创建命名查询
     */


    @Modifying  //表示执行update和delete操作
    @Query(value = "update `user` set admin= :admin where id= :id", nativeQuery = true)
    int updateAdminById(@Param("admin")Integer admin, @Param("id")Integer id);

    /**
     * 带参数的@query查询，使用具名参数：
     *
     * @param msgType
     * @return
     */
    @Query(value = "select s from SnmpTrap s where s.type = :msgType or s.type = 'common'")
    List<SnmpTrap> findByType(@Param("msgType") String msgType);

    /**
     * 带参数的@query查询，使用占位符：
     *      ?1: 表示第一个参数
     *      ?2: 表示第二个参数
     * @param id
     * @param type
     * @return
     */
    @Query("select s from SnmpTrap s where s.id=?1 and s.type=?2")
    SnmpTrap getSnmpTrapByIT(Integer id, String type);

    /**
     * 带参数的@query查询，使用like的时候，是可以用%
     * @param str
     * @return
     */
    @Query("select s from SnmpTrap s where s.type like %?1%")
    List<SnmpTrap> listSnmpTrapLike(String str);

    /**
     * 使用@query执行原生的sql查询
     */
    @Query(value = "select * from snmp_config",nativeQuery = true)
    List<SnmpTrap> listSnmpTrap();


}
